Plot and fit distributions of variables

Histogram of Velocity of all

Log distribution, 0’s make up 3% of all data

sd(log10(CC.TotalData$v[CC.TotalData$v>0]))
[1] 0.543003

Now we’re going to plot each unique krill and their bimodality with a dip test (less than 0.05 is multimodality)

ind <- unique(CC.TotalData$D_V_T)
print(ind)
  [1] 20191118_1__1 20191119_1__4 20191119_1__5 20191119_1__1 20191119_1__2 20191119_1__3 20191119_2__1 20191119_2__2 20191119_2__4 20191119_2__3
 [11] 20191119_2__5 20191119_3__1 20191119_3__2 20191119_3__5 20191119_3__4 20191119_3__3 20191119_5__1 20191119_5__3 20191119_5__4 20191119_5__2
 [21] 20191119_6__1 20191119_6__3 20191119_7__1 20191119_7__2 20191119_7__3 20191119_7__5 20191119_7__4 20191120_2__1 20191120_2__2 20191120_2__3
 [31] 20191120_2__4 20191120_2__5 20191120_4__2 20191120_4__4 20191120_4__3 20191120_4__1 20191121_1__2 20191121_1__3 20191121_1__4 20191121_1__1
 [41] 20191121_2__3 20191121_2__4 20191121_2__5 20191121_2__6 20191121_2__1 20191121_2__2 20191121_4__1 20191121_4__2 20191121_4__3 20191121_4__4
 [51] 20191121_5__3 20191121_5__4 20191121_5__2 20191121_5__1 20191121_6__1 20191121_6__3 20191121_6__2 20191121_6__4 20191121_7__1 20191121_7__2
 [61] 20191121_7__3 20191121_7__4 20191122_2__2 20191122_2__1 20191122_2__3 20191122_2__4 20191122_3__2 20191122_3__3 20191122_3__4 20191122_3__1
 [71] 20191124_10_1 20191124_10_2 20191127_1__3 20191127_1__4 20191127_1__6 20191127_1__7 20191127_1__5 20191127_1__1 20191127_1__2 20191127_4__2
 [81] 20191127_4__1 20191127_4__3 20191127_4__4 20191127_4__5 20191127_4__6 20191129_2__1 20191129_2__2 20191129_2__3 20191129_2__4 20191129_3__1
 [91] 20191129_3__2 20191129_3__3 20191129_3__4 20191129_6__1 20191129_6__2 20191129_6__3 20191129_6__4 20191130_1__1 20191130_1__2 20191130_1__3
[101] 20191130_1__4 20191130_3__1 20191130_3__2 20191130_3__3 20191130_3__4 20191130_6__1 20191130_6__2 20191130_6__3 20191130_6__4 20191130_6__5
[111] 20191201_2__1 20191201_2__2 20191201_2__3 20191201_2__4 20191202_1__1 20191202_1__2 20191202_1__3 20191202_1__4 20191204_2__1 20191204_2__2
[121] 20191204_2__3 20191204_2__4 20191205_10_1 20191205_10_2 20191205_10_3 20191205_10_4 20191212_3__1 20191212_3__2 20191212_3__3
153 Levels: 20191118_1__1 20191119_1__1 20191119_1__2 20191119_1__3 20191119_1__4 20191119_1__5 20191119_2__1 20191119_2__2 20191119_2__3 ... 20191212_3__4
length(ind)
[1] 129
library(diptest)
library(DescTools)

tab <- matrix(data = NA, nrow = 129, ncol =5, byrow = T)
colnames(tab) <- c('dip.test', 'skew', 'mean.velocity', 'sd.velocity', 'Ind')

tab <- as.data.frame(tab)
tab$Ind <- ind
mean.vel <- NULL
sd.vel <- NULL
d.v <- NULL
s.v <- NULL

for (i in 1:length(ind)){
mean.v <- mean(CC.TotalData$v[CC.TotalData$D_V_T==ind[i]])
sd.v <- sd(CC.TotalData$v[CC.TotalData$D_V_T==ind[i]])

mean.vel <- rbind(mean.vel, mean.v)
sd.vel <- rbind(sd.vel, sd.v)


vels <- (CC.TotalData$v[CC.TotalData$D_V_T==ind[i]])
vels <- log10(vels[vels>0])
d <- dip.test(vels)
d.p <- d$p.value
d.v <- rbind(d.v, d.p)

s <- Skew(vels)
s.v <- rbind(s.v, s)
##}

##ind <- unique(CC.TotalData$D_V_T)

##for (i in 1:length(ind)){
 hist(log10(CC.TotalData$v[CC.TotalData$D_V_T==ind[i]]),
     breaks = 50,
     xlab = "Velocity (Log^10 mm/s)",
     main = ind[i],
     sub = d.p)  ## change to d.p or s to print the dip test or skew value as the title instead
}


tab$skew <- s.v
tab$dip.test <- d.v
tab$mean.velocity <- (log10(mean.vel))
tab$sd.velocity <- (log10(sd.vel))
tab
write.table(tab, file = "~/Post-doc/Data/dip.test.skew.vels.csv", sep = ",", col.names = TRUE)

plot(tab)



head(TotalData)
str(TotalData)
'data.frame':   1722390 obs. of  23 variables:
 $ Date       : chr  "20191118" "20191118" "20191118" "20191118" ...
 $ File.name  : chr  "20191118_view1_" "20191118_view1_" "20191118_view1_" "20191118_view1_" ...
 $ X          : num  0.319 NaN 0.318 NaN 0.343 ...
 $ Y          : num  NaN NaN NaN NaN 0.0999 ...
 $ Z          : num  NaN -0.0573 NaN -0.0567 -0.055 ...
 $ Track      : int  1 1 1 1 1 1 1 1 1 1 ...
 $ View       : chr  "1_" "1_" "1_" "1_" ...
 $ D_V_T      : Factor w/ 153 levels "20191118_1__1",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ D_V        : Factor w/ 35 levels "20191118_1_",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Flow.rate  : num  0 0 0 0 0 0 0 0 0 0 ...
 $ Chlorophyll: num  0 0 0 0 0 0 0 0 0 0 ...
 $ Guano      : Factor w/ 2 levels "Absent","Present": 1 1 1 1 1 1 1 1 1 1 ...
 $ Light      : Factor w/ 2 levels "Absent","Present": 2 2 2 2 2 2 2 2 2 2 ...
 $ dx         : num  NaN NaN NaN NaN -0.00115 ...
 $ dy         : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
 $ dz         : num  NaN NaN NaN 0.00168 NaN ...
 $ d          : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
 $ vx         : num  NaN NaN NaN NaN -0.0345 ...
 $ vy         : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
 $ vz         : num  NaN NaN NaN 0.0503 NaN ...
 $ v          : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
 $ heading    : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
 $ pitch      : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
TotalData$Flow.rate <- as.factor(TotalData$Flow.rate)
TotalData$Chlorophyll <- as.factor(TotalData$Chlorophyll)

library(ggplot2)
package 㤼㸱ggplot2㤼㸲 was built under R version 3.6.3
ggplot(TotalData,aes(x=Flow.rate, y=turn.angle, fill=Chlorophyll))+
  geom_boxplot(notch=F, notchwidth=0.3,outlier.shape=1,outlier.size=2, coef=1.5)+
  theme(axis.text=element_text(color="black"))+
  theme(axis.text.x=element_text(angle=90,hjust=1,vjust=0.4))+
  theme(panel.grid.minor=element_blank())+
  labs(size= "",x = "Flow Rate (cm/s)", y = "Turn angle (degrees)", title = "               Light")+
  scale_fill_manual(values=c("greenyellow", "green","green1", "green2", "green3", "green4"),name = "Chlorophyll (mg/L)",
                    labels=c("0", "4.6", "6.1", "7.6", "13.5", "19"))+
  facet_grid(~Light, scales = "free_x", space = "free")
Error in FUN(X[[i]], ...) : object 'turn.angle' not found

Now looking at turning angles

Starting to look at bimodality in the variables by merging the TotalData frame with the “tab” table

print (prob)
     
               0        4.3        4.6        6.1        7.6       13.5         19
  0   0.37209302 0.00000000 0.00000000 0.00000000 0.09302326 0.00000000 0.10077519
  0.6 0.01550388 0.03100775 0.03100775 0.03100775 0.00000000 0.02325581 0.00000000
  3   0.03100775 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000
  5.9 0.17829457 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000
  8.9 0.09302326 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000
save.image("~/Post-doc/Data/Total Merged Data File.RData")
LS0tDQp0aXRsZTogIkNoZWNraW5nIERpc3RyaWJ1dGlvbiBmb3IgVmFyaWFibGVzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KUGxvdCBhbmQgZml0IGRpc3RyaWJ1dGlvbnMgb2YgdmFyaWFibGVzDQoNCmBgYHtyfQ0KDQpsb2FkKCJDOlxcVXNlcnNcXG5pY29sZWgzXFxEb2N1bWVudHNcXFBvc3QtZG9jXFxEYXRhXFxUb3RhbCBEYXRhIE1lcmdlZCBGaWxlIChOb3YgMiAyMDIxKS5SZGEiKQ0KDQpoaXN0KGxvZzEwKFRvdGFsRGF0YSR2KSwNCiAgICAgeGxhYiA9ICJWZWxvY2l0eSAoTG9nXjEwIG1tL3MpIikNCg0KYGBgDQoNCkhpc3RvZ3JhbSBvZiBWZWxvY2l0eSBvZiBhbGwNCg0KTG9nIGRpc3RyaWJ1dGlvbiwgMCdzIG1ha2UgdXAgMyUgb2YgYWxsIGRhdGENCg0KYGBge3J9DQpDQy5Ub3RhbERhdGEgPC0gbmEub21pdChUb3RhbERhdGEpDQpoZWFkKENDLlRvdGFsRGF0YSkNCjEwXm1lYW4obG9nMTAoQ0MuVG90YWxEYXRhJHZbQ0MuVG90YWxEYXRhJHY+MF0pKQ0Kc2QobG9nMTAoQ0MuVG90YWxEYXRhJHZbQ0MuVG90YWxEYXRhJHY+MF0pKQ0KDQpgYGANCk5vdyB3ZSdyZSBnb2luZyB0byBwbG90IGVhY2ggdW5pcXVlIGtyaWxsIGFuZCB0aGVpciBiaW1vZGFsaXR5IHdpdGggYSBkaXAgdGVzdCAobGVzcyB0aGFuIDAuMDUgaXMgbXVsdGltb2RhbGl0eSkNCg0KYGBge3J9DQppbmQgPC0gdW5pcXVlKENDLlRvdGFsRGF0YSREX1ZfVCkNCnByaW50KGluZCkNCmxlbmd0aChpbmQpDQpsaWJyYXJ5KGRpcHRlc3QpDQpsaWJyYXJ5KERlc2NUb29scykNCg0KdGFiIDwtIG1hdHJpeChkYXRhID0gTkEsIG5yb3cgPSAxMjksIG5jb2wgPTUsIGJ5cm93ID0gVCkNCmNvbG5hbWVzKHRhYikgPC0gYygnZGlwLnRlc3QnLCAnc2tldycsICdtZWFuLnZlbG9jaXR5JywgJ3NkLnZlbG9jaXR5JywgJ0luZCcpDQoNCnRhYiA8LSBhcy5kYXRhLmZyYW1lKHRhYikNCnRhYiRJbmQgPC0gaW5kDQptZWFuLnZlbCA8LSBOVUxMDQpzZC52ZWwgPC0gTlVMTA0KZC52IDwtIE5VTEwNCnMudiA8LSBOVUxMDQoNCmZvciAoaSBpbiAxOmxlbmd0aChpbmQpKXsNCm1lYW4udiA8LSBtZWFuKENDLlRvdGFsRGF0YSR2W0NDLlRvdGFsRGF0YSREX1ZfVD09aW5kW2ldXSkNCnNkLnYgPC0gc2QoQ0MuVG90YWxEYXRhJHZbQ0MuVG90YWxEYXRhJERfVl9UPT1pbmRbaV1dKQ0KDQptZWFuLnZlbCA8LSByYmluZChtZWFuLnZlbCwgbWVhbi52KQ0Kc2QudmVsIDwtIHJiaW5kKHNkLnZlbCwgc2QudikNCg0KDQp2ZWxzIDwtIChDQy5Ub3RhbERhdGEkdltDQy5Ub3RhbERhdGEkRF9WX1Q9PWluZFtpXV0pDQp2ZWxzIDwtIGxvZzEwKHZlbHNbdmVscz4wXSkNCmQgPC0gZGlwLnRlc3QodmVscykNCmQucCA8LSBkJHAudmFsdWUNCmQudiA8LSByYmluZChkLnYsIGQucCkNCg0KcyA8LSBTa2V3KHZlbHMpDQpzLnYgPC0gcmJpbmQocy52LCBzKQ0KIyN9DQoNCiMjaW5kIDwtIHVuaXF1ZShDQy5Ub3RhbERhdGEkRF9WX1QpDQoNCiMjZm9yIChpIGluIDE6bGVuZ3RoKGluZCkpew0KIGhpc3QobG9nMTAoQ0MuVG90YWxEYXRhJHZbQ0MuVG90YWxEYXRhJERfVl9UPT1pbmRbaV1dKSwNCiAgICAgYnJlYWtzID0gNTAsDQogICAgIHhsYWIgPSAiVmVsb2NpdHkgKExvZ14xMCBtbS9zKSIsDQogICAgIG1haW4gPSBpbmRbaV0sDQogICAgIHN1YiA9IGQucCkgICMjIGNoYW5nZSB0byBkLnAgb3IgcyB0byBwcmludCB0aGUgZGlwIHRlc3Qgb3Igc2tldyB2YWx1ZSBhcyB0aGUgdGl0bGUgaW5zdGVhZA0KfQ0KDQp0YWIkc2tldyA8LSBzLnYNCnRhYiRkaXAudGVzdCA8LSBkLnYNCnRhYiRtZWFuLnZlbG9jaXR5IDwtIChsb2cxMChtZWFuLnZlbCkpDQp0YWIkc2QudmVsb2NpdHkgPC0gKGxvZzEwKHNkLnZlbCkpDQp0YWINCndyaXRlLnRhYmxlKHRhYiwgZmlsZSA9ICJ+L1Bvc3QtZG9jL0RhdGEvZGlwLnRlc3Quc2tldy52ZWxzLmNzdiIsIHNlcCA9ICIsIiwgY29sLm5hbWVzID0gVFJVRSkNCg0KcGxvdCh0YWIpDQoNCg0KaGVhZChUb3RhbERhdGEpDQpzdHIoVG90YWxEYXRhKQ0KVG90YWxEYXRhJEZsb3cucmF0ZSA8LSBhcy5mYWN0b3IoVG90YWxEYXRhJEZsb3cucmF0ZSkNClRvdGFsRGF0YSRDaGxvcm9waHlsbCA8LSBhcy5mYWN0b3IoVG90YWxEYXRhJENobG9yb3BoeWxsKQ0KDQpgYGANCg0KDQpOb3cgbG9va2luZyBhdCB0dXJuaW5nIGFuZ2xlcw0KDQpgYGB7cn0NClRvdGFsRGF0YSR0dXJuLmFuZ2xleHkgPC0gYXRhbjIoVG90YWxEYXRhJFgsIFRvdGFsRGF0YSRZKQ0KVG90YWxEYXRhJHR1cm4uYW5nbGV5eiA8LSBhdGFuMihUb3RhbERhdGEkWSwgVG90YWxEYXRhJFopDQoNCg0KbHRoIDwtIGRpbShUb3RhbERhdGEpWzFdDQpkeDEgPC0gVG90YWxEYXRhJGR4WzE6KGx0aC0xKV0NCmR4MiA8LSBUb3RhbERhdGEkZHhbMjpsdGhdDQpkeTEgPC0gVG90YWxEYXRhJGR5WzE6KGx0aC0xKV0NCmR5MiA8LSBUb3RhbERhdGEkZHlbMjpsdGhdDQpkejEgPC0gVG90YWxEYXRhJGR6WzE6KGx0aC0xKV0NCmR6MiA8LSBUb3RhbERhdGEkZHpbMjpsdGhdDQpEIDwtIChkeDEqZHgyKSsoZHkxKmR5MikrKGR6MSpkejIpDQpkMSA8LSBzcXJ0KGR4MV4yICsgZHkxXjIgK2R6MV4yKQ0KZDIgPC0gc3FydChkeDJeMiArIGR5Ml4yICtkejJeMikNCg0KZGQgPC0gRC9kMS9kMg0KaGlzdChhY29zKGRkKS9waSoxODApDQoNClRvdGFsRGF0YSR0dXJuLmFuZ2xlIDwtIGMoTkEsIGFjb3MoRC9kMS9kMikpL3BpKjE4MA0KaGVhZChUb3RhbERhdGEpDQpDQy5Ub3RhbERhdGEgPC0gbmEub21pdChUb3RhbERhdGEpDQpoZWFkKENDLlRvdGFsRGF0YSkNCnRhaWwoQ0MuVG90YWxEYXRhKQ0Kc3RyKENDLlRvdGFsRGF0YSkNCkNDLlRvdGFsRGF0YSRGbG93LnJhdGUgPC0gYXMuY2hhcmFjdGVyKENDLlRvdGFsRGF0YSRGbG93LnJhdGUpDQpDQy5Ub3RhbERhdGEkQ2hsb3JvcGh5bGw8LSBhcy5jaGFyYWN0ZXIoQ0MuVG90YWxEYXRhJENobG9yb3BoeWxsKQ0KQ0MuVG90YWxEYXRhJEd1YW5vIDwtIGFzLmNoYXJhY3RlcihDQy5Ub3RhbERhdGEkR3Vhbm8pDQpDQy5Ub3RhbERhdGEkTGlnaHQgPC0gYXMuY2hhcmFjdGVyKENDLlRvdGFsRGF0YSRMaWdodCkNCg0KDQpDQy5Ub3RhbERhdGEkRmxvdy5yYXRlIDwtIGFzLm51bWVyaWMoQ0MuVG90YWxEYXRhJEZsb3cucmF0ZSkNCkNDLlRvdGFsRGF0YSRDaGxvcm9waHlsbDwtIGFzLm51bWVyaWMoQ0MuVG90YWxEYXRhJENobG9yb3BoeWxsKQ0KDQpoZWFkKENDLlRvdGFsRGF0YSkNCg0KaW5kIDwtIHVuaXF1ZShDQy5Ub3RhbERhdGEkRF9WX1QpDQoNCmZvciAoaSBpbiAxOmxlbmd0aChpbmQpKXsNCmhpc3QoQ0MuVG90YWxEYXRhJHR1cm4uYW5nbGVbQ0MuVG90YWxEYXRhJERfVl9UPT1pbmRbaV1dLA0KICAgICAgIGJyZWFrcyA9IDUwLA0KICAgICB4bGFiID0gIlR1cm4gQW5nbGVzIiwNCiAgICAgbWFpbiA9ICIiKSANCn0NCg0KcGxvdChDQy5Ub3RhbERhdGEkRmxvdy5yYXRlLCBDQy5Ub3RhbERhdGEkdHVybi5hbmdsZSwgbWFpbiA9ICIiLCB4bGFiID0gIkZsb3cgUmF0ZSAoY20vcykiLCB5bGFiID0gIlR1cm4gYW5nbGUgKGRlZ3JlZXMpIikNCnBsb3QoQ0MuVG90YWxEYXRhJENobG9yb3BoeWxsLCBDQy5Ub3RhbERhdGEkdHVybi5hbmdsZSwgbWFpbiA9ICIiLCB4bGFiID0gIkNobG9yb3BoeWxsIChtZy9MKSIsIHlsYWIgPSAiVHVybiBhbmdsZSAoZGVncmVlcykiKQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoVG90YWxEYXRhLGFlcyh4PUZsb3cucmF0ZSwgeT1sb2cxMCh2KSwgZmlsbD1DaGxvcm9waHlsbCkpKw0KICBnZW9tX2JveHBsb3Qobm90Y2g9Riwgbm90Y2h3aWR0aD0wLjMsb3V0bGllci5zaGFwZT0xLG91dGxpZXIuc2l6ZT0yLCBjb2VmPTEuNSkrDQogIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIikpKw0KICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTAsaGp1c3Q9MSx2anVzdD0wLjQpKSsNCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vcj1lbGVtZW50X2JsYW5rKCkpKw0KICBsYWJzKHNpemU9ICIiLHggPSAiRmxvdyBSYXRlIChjbS9zKSIsIHkgPSAiVmVsb2NpdHkgKExvZyB0cmFuc2Zvcm1lZCkoY20vcykiLCB0aXRsZSA9ICJMaWdodCIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImdyZWVueWVsbG93IiwgInllbGxvd2dyZWVuIiwibGlnaHRncmVlbiIsICJncmVlbiIsICJncmVlbjMiLCAiZ3JlZW40IiwgImRhcmtncmVlbiIpLG5hbWUgPSAiQ2hsb3JvcGh5bGwgKG1nL0wpIiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIjAiLCAiNC4zIiwgIjQuNiIsICI2LjEiLCAiNy42IiwgIjEzLjUiLCAiMTkiKSkrDQogIGZhY2V0X2dyaWQofkxpZ2h0LCBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZSIpDQoNCmdncGxvdChUb3RhbERhdGEsYWVzKHg9Rmxvdy5yYXRlLCB5PXR1cm4uYW5nbGUsIGZpbGw9Q2hsb3JvcGh5bGwpKSsNCiAgZ2VvbV9ib3hwbG90KG5vdGNoPUYsIG5vdGNod2lkdGg9MC4zLG91dGxpZXIuc2hhcGU9MSxvdXRsaWVyLnNpemU9MiwgY29lZj0xLjUpKw0KICB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIpKSsNCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTkwLGhqdXN0PTEsdmp1c3Q9MC40KSkrDQogIHRoZW1lKHBhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpKSsNCiAgbGFicyhzaXplPSAiIix4ID0gIkZsb3cgUmF0ZSAoY20vcykiLCB5ID0gIlR1cm4gQW5nbGUgKGRlZ3JlZXMpIiwgdGl0bGUgPSAiTGlnaHQiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJncmVlbnllbGxvdyIsICJ5ZWxsb3dncmVlbiIsImxpZ2h0Z3JlZW4iLCAiZ3JlZW4iLCAiZ3JlZW4zIiwgImdyZWVuNCIsICJkYXJrZ3JlZW4iKSxuYW1lID0gIkNobG9yb3BoeWxsIChtZy9MKSIsDQogICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCIwIiwgIjQuMyIsICI0LjYiLCAiNi4xIiwgIjcuNiIsICIxMy41IiwgIjE5IikpKw0KICBmYWNldF9ncmlkKH5MaWdodCwgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWUiKQ0KDQpgYGANCg0KDQoNCg0KDQoNClN0YXJ0aW5nIHRvIGxvb2sgYXQgYmltb2RhbGl0eSBpbiB0aGUgdmFyaWFibGVzIGJ5IG1lcmdpbmcgdGhlIFRvdGFsRGF0YSBmcmFtZSB3aXRoIHRoZSAidGFiIiB0YWJsZQ0KYGBge3J9DQojI2FnZ3JlZ2F0aW5nIENvbXBsZXRlIGNhc2VzIG9mIFRvdGFsRGF0YSBzbyB3ZSBjYW4gbWVyZ2UgaXQgd2l0aCB0YWIgZGF0YQ0KDQpBR0dfVEQgPC0gYWdncmVnYXRlKENDLlRvdGFsRGF0YSwgYnkgPSBsaXN0KENDLlRvdGFsRGF0YSREX1ZfVCksIEZVTiA9IG1lYW4pDQpoZWFkKEFHR19URCkNCkFHR19URCA8LSBBR0dfVERbIC1jKDI6MywgODoxMCkgXQ0KY29sbmFtZXMoQUdHX1REKSA8LSBjKCJJbmQiLCAiWCIsICJZIiwgIloiLCAiVHJhY2siLCAiRmxvdy5SYXRlIiwgIkNobG9yb3BoeWxsIiwgIkd1YW5vIiwgIkxpZ2h0IiwgImR4IiwgImR5IiwgImR6IiwgImQiLCAidngiLCAidnkiLCAidnoiLCAidiIsICJoZWFkaW5nIiwgInBpdGNoIiwgInR1cm4uYW5nbGV4eSIsICJ0dXJuLmFuZ2xleXoiLCAidHVybi5hbmdsZSIpDQpoZWFkKEFHR19URCkNCnRhaWwoQUdHX1REKQ0KDQoNCnRhYl9BR0cgPC0gbWVyZ2UoQUdHX1RELCB0YWIsIGJ5ID0gIkluZCIpDQpoZWFkKHRhYl9BR0cpDQpzdHIodGFiX0FHRykNCnRhYl9BR0ckRmxvdy5SYXRlIDwtIGFzLmZhY3Rvcih0YWJfQUdHJEZsb3cuUmF0ZSkNCnRhYl9BR0ckQ2hsb3JvcGh5bGwgPC0gYXMuZmFjdG9yKHRhYl9BR0ckQ2hsb3JvcGh5bGwpDQoNCmZyZXEgPC0gdGFibGUodGFiX0FHRyRGbG93LlJhdGUsIHRhYl9BR0ckQ2hsb3JvcGh5bGwpDQpwcmludChmcmVxKQ0KcHJvYiA8LSBwcm9wLnRhYmxlKGZyZXEpICMjUmVsYXRpdmUgRnJlcXVlbmN5IFRhYmxlDQpwcmludCAocHJvYikNCg0KICMjc3RhcnRpbmcgdG8gcGxvdCB0aGUgZGlwIHRlc3QgYW5kIHNrZXcgaW4gdGhlIHZhcmlhYmxlcw0KcGxvdCh0YWJfQUdHJEZsb3cuUmF0ZSwgdGFiX0FHRyRkaXAudGVzdCwgeGxhYiA9ICJGbG93IFJhdGUgKGNtL3MpIiwgeWxhYiA9ICJEaXAgVGVzdCAocC52YWx1ZSkiKQ0KcGxvdCh0YWJfQUdHJEZsb3cuUmF0ZSwgdGFiX0FHRyRza2V3LCB4bGFiID0gIkZsb3cgUmF0ZSAoY20vcykiLCB5bGFiID0gIlNrZXcgVGVzdCAocC52YWx1ZSkiKQ0KcGxvdCh0YWJfQUdHJENobG9yb3BoeWxsLCB0YWJfQUdHJGRpcC50ZXN0LCB4bGFiID0gIkNobG9yb3BoeWxsIChtZy9MKSIsIHlsYWIgPSAiRGlwIFRlc3QgKHAudmFsdWUpIikNCnBsb3QodGFiX0FHRyRDaGxvcm9waHlsbCwgdGFiX0FHRyRza2V3LCB4bGFiID0gIkNobG9yb3BoeWxsIChtZy9MKSIsIHlsYWIgPSAiU2tldyBUZXN0IChwLnZhbHVlKSIpDQoNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGluZCkpew0KcGxvdChDQy5Ub3RhbERhdGEkdHVybi5hbmdsZVtDQy5Ub3RhbERhdGEkRF9WX1Q9PWluZFtpXV0sIGxvZzEwKENDLlRvdGFsRGF0YSR2W0NDLlRvdGFsRGF0YSREX1ZfVD09aW5kW2ldXSksDQogICAgICAgICAgICB4bGFiID0gIlR1cm4gQW5nbGVzIiwNCiAgICAgeWxhYiA9ICJWZWxvY2l0eSIsDQogICAgICAgICAgbWFpbiA9ICIiKSANCn0NCg0KYGBgDQoNCg0KYGBge3J9DQpzYXZlLmltYWdlKCJ+L1Bvc3QtZG9jL0RhdGEvVG90YWwgTWVyZ2VkIERhdGEgRmlsZS5SRGF0YSIpDQoNCmBgYA0KDQoNCg0K